This is an excerpt from a worksheet on extrasolar planets for second year undergraduate students. The concepts I aim to teach are:
Plot the planetary mass ($M_p \sin i$) vs orbital separation ($a$) on a log-log scale for the following cases:
In [3]:
# Get the exoplanet data from the URL into the variable called 'all'
# This file has over 3000 lines, so this step can take a minute
# depending on your connection
all <- read.csv(url("http://exoplanet.eu/catalog/csv/"), header = TRUE)
# Let's start by listing the columns in this data file
colnames(all)
In [4]:
plot(all$semi_major_axis,all$mass_sini,xlab= "a [AU]", xlim = c(1e-3,100), ylim = c(1e-3, 50),
pch = 20, ylab="M sin i [Mjup]", frame.plot = TRUE, cex.lab = 1.4, log = "xy", cex = 1.0)
The plot command is smart enough to remove the points that have missing data, but if we wanted to filter these out ahead of time, we could do:
In [7]:
# Load dplyr, which makes sorting dataframes a breeze
library(dplyr, lib.loc="/Library/Frameworks/R.framework/Versions/3.3/Resources/library")
# Keep only the two columns of interest, and filter out all the NAs
all %>%
select(mass_sini, semi_major_axis) %>%
na.omit() -> ma_array
# Now plot these filtered data
plot(ma_array$semi_major_axis, ma_array$mass_sini, xlab= "a [AU]", xlim = c(1e-3,100), ylim = c(1e-3, 50),
pch = 20, ylab="M sin i [Mjup]", frame.plot = TRUE, cex.lab = 1.4, log = "xy", cex = 1.0,
main = "All Extrasolar Planets")
# Let's show where in the plot we'll find the Hot Jupiters by placing a partly transparent blue box over
rect(0.01, 0.1, 0.1,100, col = "skyblue", border = "transparent")
# The rectangle covers the data points, so let's plot them again, over the top
points(ma_array$semi_major_axis, ma_array$mass_sini, pch = 20)
The blue rectangle highlights the region of the plot we'll get the so-called "Hot Jupiters" -- Jupiter-like planets orbiting very near to their parent stars.
b) Now we want to filter for only those planets detected through the radial velocity method.
In [8]:
all %>%
filter (detection_type == "Radial Velocity") %>%
select(mass_sini, semi_major_axis) %>%
na.omit() -> radvels
# Now plot these filtered data
plot(radvels$semi_major_axis, radvels$mass_sini, xlab= "a [AU]", xlim = c(1e-3,100), ylim = c(1e-3, 50),
pch = 20, ylab="M sin i [Mjup]", frame.plot = TRUE, cex.lab = 1.4, log = "xy", cex = 1.0,
main = "Planets detected through Radial Velocity Searches")
c) Now we want to filter for only those planets detection through the transit method
In [9]:
all %>%
filter (detection_type == "Primary Transit") %>%
select(mass_sini, semi_major_axis) %>%
na.omit() -> transits
# Now plot these filtered data
plot(transits$semi_major_axis, transits$mass_sini, xlab= "a [AU]", xlim = c(1e-3,100), ylim = c(1e-3, 50),
pch = 20, ylab="M sin i [Mjup]", frame.plot = TRUE, cex.lab = 1.4, log = "xy", cex = 1.0,
main = "Planets detected through Transits")
The High Accuracy Radial Velocity Planet Searcher (HARPS) has found over one thousand exoplanets using the radial velocity search method. It has an accuracy of 1 m/s in radial velocity.
How does this translate into limits on the masses and orbits of planets you can detect with HARPS orbiting a $1 M_\odot$ star?
From our lecture notes, we express Kepler's equation for the star-planet system as follows: $$ v_* \sin i = 28.4\left(\frac{P}{1\mathrm{yr}}\right)^{-1/3}\left(\frac{M_p\sin i}{M_J}\right)\left(\frac{M_*}{M_\odot}\right)^{-2/3}\mathrm{ms}^{-1} $$ where $v_*$ is the velocity of the star, $P$ is the orbital period of the planet around the star (in years), $M_J$ is the mass of Jupiter, $M_*$ is the mass of the parent star in $M_\odot$.
Using $M_* = 1 M_\odot$, and Kepler's harmonic law $P^2 = a^3$ (remember, this works in this specific choice of units), we can rewrite the equation above as:
$$ \frac{M_p\sin i}{M_J} = \frac{v_*\sin i}{28.4\,\mathrm{m/s}}\left(\frac{a}{\mathrm{AU}}\right)^2 $$With HARPS's accuracy of 1 m/s, we'd probably believe a planetary detection if it had a radial velocity greater than 3 m/s, so for this case we set $v_*\sin i$ = 3 m/s. We now plot this as the pink line on the graph below:
In [10]:
# Make the original plot
plot(ma_array$semi_major_axis, ma_array$mass_sini, xlab= "a [AU]", xlim = c(1e-3,100), ylim = c(1e-3, 50),
pch = 20, ylab="M sin i [Mjup]", frame.plot = TRUE, cex.lab = 1.4, log = "xy", cex = 1.0)
# Now overplot the line in the equation above
curve(3/28.4 * x^2, add=TRUE, col = "magenta", lwd = 3.0)
HARPS will be insensitive to planets orbiting at distances to the right of the pink line and to planets with masses below the pink line.
In [ ]: